/*
*********************************************************************************************************
*
* 文件说明:    缓冲区管理
* 软件模块:    buffer.c
* 版本  :     V1.0
* 描  述 :    简单的缓冲区结构
*
* 版本更新记录 :
*   版本   修改时间       修改人      描述
*   V1.0   2025-5-14      Miaozi    初始版本
* 
*
********************************************************************************************************
*/
#include "buffer.h"

/**
 * @brief 初始化缓冲区
 */
void BUF_Init(BUFFER_T *buf, u8 *data, u16 size) 
{
  buf->data = data;     // 指向实际存储区的指针
  buf->size = size;     // 缓冲区总容量
  buf->length = 0;      // 初始化时数据长度为0
  return;
}

/**
 * @brief 写入数据到缓冲区
 * @param buf: 缓冲区对象
 * @param src: 源数据指针
 * @param len: 数据长度
 * @return 成功返回1，失败返回0
 */
u8 BUF_Write(BUFFER_T *buf, u8 *src, u16 len)
{
  // 检查缓冲区是否有足够空间
  if (buf->length + len > buf->size)
  {
      return 0; // 数据写入失败，空间不足
  }

  // 将数据写入缓冲区
  memcpy(buf->data + buf->length, src, len);

  // 更新当前数据长度
  buf->length += len;

  return 1; // 数据写入成功
}

/**
 * @brief 格式化写入数据到缓冲区
 * @param buf: 缓冲区对象
 * @param format: 格式化字符串
 * @param ...: 格式化参数
 * @return 写入成功返回1，失败返回0
 */
u8 BUF_Write_Format(BUFFER_T *buf,char *format, ...)
{
  va_list args;
  int len;
  u8 tempBuf[256];  // 临时缓冲区，假设最大格式化字符串大小为 256

  // 使用 va_list 进行格式化字符串处理
  va_start(args, format);
  
  // 格式化数据并计算需要的空间
  len = vsnprintf((char *)tempBuf, sizeof(tempBuf), format, args);
  
  va_end(args);

  // 如果格式化后的数据超出临时缓冲区大小，返回失败
  if (len < 0 || len >= sizeof(tempBuf)) 
  {
    return 0; // 格式化失败或超出缓冲区空间
  }

  // 调用 BUF_Write 将数据写入目标缓冲区
  if (BUF_Write(buf, tempBuf, len)) 
  {
    return 1; // 数据写入成功
  }

  return 0; // 数据写入失败
}

/**
 * @brief 返回队尾指针
 */
u8* BUF_GetTailInfo(BUFFER_T *buf)
{

  return buf->data+buf->length;
}

/**
 * @brief 返回剩余空间
 */
u16 BUF_GetRemainSize(BUFFER_T *buf)
{

  return buf->size-buf->length;
}

/**
 * @brief 清空缓冲区
 */
void BUF_Clear(BUFFER_T *buf) 
{
  buf->length = 0;                    //  重置有效数据长度为0
  return;
}

/**
 * @brief 清空缓冲区数据
 */
void BUF_DelData(BUFFER_T *buf) 
{
  memset(buf->data,0,buf->length);  //  全清空
  buf->length = 0;                  //  重置有效数据长度为0
  return;
}

/***************************** LiteBsp by Miaozi (END OF FILE) *********************************/
